package uabc.ia.agentelimpieza.main;

import java.awt.Canvas;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferStrategy;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JViewport;

import uabc.ia.agentelimpieza.agente.AgenteAspiradora;
import uabc.ia.agentelimpieza.ambiente.Ambiente;
import uabc.ia.agentelimpieza.constantes.Constantes;
import uabc.ia.agentelimpieza.entidades.Accion;
import uabc.ia.agentelimpieza.entidades.Estado;
import uabc.ia.agentelimpieza.entidades.Percepcion;
import uabc.ia.agentelimpieza.vista.AmbienteUI;
import uabc.ia.agentelimpieza.vista.AspiradoraUI;

@SuppressWarnings("serial")
public class SimuladorAgenteAspiradora extends Canvas implements Constantes,Runnable{
	private AmbienteUI ambienteUI;
	private AspiradoraUI aspiradoraUI;
	private BufferStrategy strategy;
	private Ambiente ambiente;
	private AgenteAspiradora agenteAspiradora;
	
	public SimuladorAgenteAspiradora(){
		ambienteUI = new AmbienteUI();
		aspiradoraUI =new AspiradoraUI(25,25);
		ambiente = new Ambiente();
	}
	
	public void inicializa(){
		requestFocusInWindow();
        createBufferStrategy(2);
        strategy = getBufferStrategy();
		setSize(_WIDTH,_HEIGHT);
		addMouseListener(
	      new MouseAdapter() {
	        public void mousePressed(MouseEvent e) {
	        	cambiarSuciedadCelda(e.getX(), e.getY());
	        }
	      });
		ambiente.addObserver(ambienteUI);
		ambiente.addObserver(aspiradoraUI);
	}
	
	public void loop(){
		inicializa();
		while(true){
            paint(strategy.getDrawGraphics());
            strategy.show();
            try{
                Thread.sleep(1000/FPS);
            }catch(InterruptedException e){
                Logger.getLogger(SimuladorAgenteAspiradora.class.getName()).log(Level.SEVERE, null, e);
            }
		}
	}
	
	public void paint(Graphics g){
		ambienteUI.paint(g);
		aspiradoraUI.paint(g);
	}
	
	public void cambiarSuciedadCelda(int x, int y){
		ambienteUI.cambiarSuciedadCelda(x, y);
	}

	@Override
	public void run() {
		loop();
	}
	
	public void probarAmbiente(Ambiente ambiente, AgenteAspiradora agente){
		do{
			Percepcion percepcion= agente.obtenerPercepcion(ambiente);
			Accion accion = agente.programaDeAgente(percepcion);
			funcionActualizar(accion, agente, ambiente);
			
			JScrollPane scrollPane =(JScrollPane) getParent().getComponent(9);
			JViewport view =(JViewport)scrollPane.getComponent(0);
			JTextArea text = (JTextArea)view.getComponent(0);
			text.append(accion.getNumeroRegla()+"-"+percepcion.getPercepcion()+"-"+accion.getAccion()+"\n");
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}while(!ambiente.isLimpio());
	}
	
	public void funcionActualizar(Accion accion, AgenteAspiradora agente, Ambiente ambiente){
		agente.realizarAccion(accion,ambiente);
	}
	
	public void limpiar(){
		ambiente = new Ambiente();
		ambiente.setCeldas(ambienteUI.getCeldasModelo());
		agenteAspiradora = new AgenteAspiradora();
		ambiente.addObserver(ambienteUI);
		ambiente.addObserver(aspiradoraUI);
		probarAmbiente(ambiente,agenteAspiradora);
		ambienteUI.inicializarCeldas();
	}
}
